#include <iostream>

using namespace std;

// 注意：方法必须卸载main方法的上面，否则找不到，时一种自上而下的方式查找
// 指针的方式修改值
void change_value(int *p){
	*p = 101;
}

// 引用的方式修改值
void change_value2(int &p){
	p = 109;
}

void my_swap(int *a, int *b){
	int temp = *a;
	*a = *b;
	*b = temp;
}

void my_swap2(int &a, int &b){
	int temp = a;
	a = b;
	b = temp;
}

struct student{
	int id;
	char name[64];
};

void printS(struct student s){
	cout << s.id << " " << s.name << endl;
}

void printS1(struct student *s){
	cout << s->id << " " << s->name << endl;
}


void printS2(struct student &s){
	cout << s.id << " " << s.name << endl;
}

/**
 * 1、引用的定义，是一种关系声明，声明它和原有变量的关系，故而和原有变量保持一致，且不分配内存，和被引用变量有相同的地址
 * 2、引用被声明的时候必须初始化，一经声明，不可变更
 * 3、引用可以被再次引用，多次引用的结果，是原有变量的的多个别名而已
 * 4、&符号前，有数据类型时，为引用，其他皆为取地址
 */
int main(int argc, char *argv[]) {

	int a = 20;
	int b = 30;

	// 获取a的地址给定义的p，p代表a的地址，*p代表地址的取值
	int *p = &a;
	cout << p << endl;
	cout << *p << endl;
	// 将b的地址给p
	p = &b;
	cout << p << endl;
	cout << *p << endl;

	// int & 被看作是定义引用数据类型，re是a的别名   
	int &re = a;
	re = 50;
	cout << "-----a" << endl;
	cout << a << endl;
	// 将b的值，赋值给re，也就是给a
	re = b;
	cout << "-----b" << endl;
	cout << a << endl;
	// 定义引用的时候，必须对引用进行初始化
	int &re2 = b;
	re2 = a; // a的引用已经被b赋值，那么a就是30
	cout << "-----b" << endl;
	cout << b << endl;

	change_value(&b);
	cout << "-----指针" << endl;
	cout << b << endl;

	change_value2(b);
	cout << "-----引用" << endl;
	cout << b << endl;


	int c = 32;
	int d = 42;
	cout << "c = " << c << endl;
	cout << "d = " << d << endl;
	// my_swap(&c, &d);
	my_swap2(c, d);
	cout << "----" << endl;
	cout << "c = " << c << endl;
	cout << "d = " << d << endl;

	student stu = {11,"吴开杰"};
	cout << "----" << endl;
	printS(stu);
	printS1(&stu);
	printS2(stu);

	return 0;
}

